package com.kuang.cas;

import java.util.concurrent.atomic.AtomicInteger;

/**
 *  CAS是什么？
 *      compareAndSet(int expect, int update):比较并交换
 *      入参：期望，更新；
 *      如果我期望的结果达到预期，就去更新，如果没有达到预期，就不更新
 *      因为 num++ 操作在底层不是原子操作，所以多线程并发会有问题，所以使用原子包装类
 *      但是原子包装类CAS有个问题（ABA问题）
 *      就是主内存：num=0，线程A,修改num=1,然后又修改回去0,这时候操作对线程B来说，线程B拿到的是0，B是不知道A改过
 *  如何解决CAS的ABA问题？
 *      ABA问题：有线程修改了主内存，又修改回去，其他线程感知不到
 *      使用原子引用，带版本号
 *  CAS缺点？
 *      CAS比较当前工作内存中的值和主内存中的值，如果这个值和期望值相同，就执行更新操作，否则就一直循环！
 *      1.循环会耗时
 *      2.一次性只能保证一个共享变量的原子性
 *      3.ABA问题
 *
 */

// CAS简单实例：比较并交换
public class Test1 {
    public static void main(String[] args) {
        // 创建一个原子包装类，设置初识值2020
        AtomicInteger atomicInteger = new AtomicInteger(2020);

        // public final boolean compareAndSet(int expect, int update)
        // atomicInteger进行判断，如果期望值达到2020,就更新为2021
        System.out.println(atomicInteger.compareAndSet(2020, 2021));
        System.out.println(atomicInteger.get()); // 获取原子包装类的值
        System.out.println(atomicInteger.compareAndSet(2020, 2021));
        System.out.println(atomicInteger.get());
        /*
            true
            2021
            false
            2021
         */
    }
}
